Skip to content

Implement base element and API for customizing RLib Logger#72

Merged
JavaSaBr merged 10 commits into
developfrom
improve-logger-part-2
Jun 5, 2026
Merged

Implement base element and API for customizing RLib Logger#72
JavaSaBr merged 10 commits into
developfrom
improve-logger-part-2

Conversation

@JavaSaBr
Copy link
Copy Markdown
Owner

@JavaSaBr JavaSaBr commented Jun 5, 2026

Overview

This branch refactors the logger stack around a configurable message pipeline and updates logger APIs to expose richer context (Logger instance, shortName) during rendering/consumption. It introduces a new configuration model in rlib-logger-impl (LoggerConfig, loaders, resolver, consumers, renderers), rewires DefaultLoggerService to use it, and expands regression coverage for level-threshold and consumer-routing behavior. Several API shape changes are intentional for alpha releases.

Changes Summary

1. Logger API evolution (rlib-logger-api)

  • Added Logger.shortName() to the public Logger contract.
  • Renamed logger factory entrypoints from make(...) to getLogger(...) in LoggerFactory and updated LoggerManager call sites.
  • Moved service access behind LoggerFactory.getLoggerService() and updated LoggerManager to delegate level operations via that service.
  • Changed LoggerService.write(...) signature from (LoggerLevel, String loggerName, String logMessage) to (Logger logger, LoggerLevel level, String message).
  • Renamed null-object implementation classes to NoOps (NullLogger -> NoOpsLogger, NullLoggerFactory -> NoOpsLoggerFactory) and added NoOpsLoggerService.

2. New configurable logger pipeline (rlib-logger-impl)

  • Added new config contracts:
    • LogMessageConsumer
    • LogMessageRender
    • LoggerConfig
    • LoggerConfigLoader
    • LoggerConfigResolver
  • Added default implementations:
    • DefaultLoggerConfig
    • DefaultLoggerConfigLoader
    • ConsoleMessageConsumer
    • SimpleLogMessageRender
  • Replaced old listener/writer-based DefaultLoggerService flow with config-driven routing:
    • Per-logger level configuration through LoggerConfig.configureLevels(...)
    • Per-level consumer resolution with fallback from logger-specific keys to root keys
    • Message rendering delegated to LogMessageRender

3. Level threshold and routing behavior fixes

  • Fixed level-threshold configuration semantics so a configured level enables that level and higher severity (INFO enables INFO, WARNING, ERROR; not DEBUG/TRACE).
  • Kept consumer lookup semantics as requested level and lower fallback for routing, allowing coarse consumer registration (for example TRACE consumer catches lower-priority fallbacks).
  • Added reset-before-apply behavior in DefaultLoggerConfig.configureLevels(...) to avoid stale overrides.

4. DefaultLoggerService and DefaultLogger refactor

  • DefaultLoggerService now stores loggers by full name and creates them through a unified factory path.
  • Added robust shortName extraction for string logger names, including trailing-dot handling.
  • DefaultLogger caches resolved consumers per level (trace/debug/info/warn/error) to avoid repeated config lookups during writes.
  • FolderFileListener was removed as part of the old output model removal.

5. SLF4J integration updates

  • Updated Slf4jLoggerFactory to the new LoggerFactory contract (getLogger(...)) and added logger instance caching.
  • Added Slf4jLogger.shortName() implementation.
  • Added LoggerService exposure in SLF4J factory via NoOpsLoggerService.

6. Event flow diagram

flowchart TD
  A["Logger call"] --> B["DefaultLogger checks level"]
  B --> C["DefaultLoggerService write"]
  C --> D["Resolve consumers from config"]
  D --> E["Consumer renders message"]
  E --> F["Output stream"]
Loading

7. Configuration pipeline diagrams

flowchart TD
  A["DefaultLoggerFactory created"] --> B["LoggerConfigResolver load"]
  B --> C["Collect LoggerConfigLoader list"]
  C --> D["Sort loaders by order"]
  D --> E["Try load from each loader"]
  E --> F["First present config selected"]
  F --> G["Create DefaultLoggerService with config"]
Loading
flowchart TD
  A["Logger write request"] --> B["Resolve cached consumers for level"]
  B -->|cache miss| C["DefaultLoggerConfig resolveConsumers"]
  C --> D["Lookup logger key by level fallback"]
  D -->|not found| E["Lookup ROOT key by level fallback"]
  E -->|not found| F["Use empty consumer array"]
  D -->|found| G["Return consumer array"]
  E -->|found| G
  F --> H["Cache resolved consumers"]
  G --> H
  H --> I["Consume and render message"]
Loading

8. Usage samples

// Logger retrieval using updated factory/manager shape
Logger logger = LoggerManager.getLogger(MyType.class);
Logger named = LoggerManager.getLogger("com.example.MyLogger");

// Accessing logger service for runtime level control
LoggerService service = LoggerManager.getLoggerService();
service.configureDefault(LoggerLevel.INFO, true);
service.enable(MyType.class, LoggerLevel.DEBUG);

// Logger identity helpers
String fullName = logger.name();
String shortName = logger.shortName();

@JavaSaBr JavaSaBr self-assigned this Jun 5, 2026
Copilot AI review requested due to automatic review settings June 5, 2026 12:49
@github-actions
Copy link
Copy Markdown

github-actions Bot commented Jun 5, 2026

Overall Project 57% -0.23% 🍏
Files changed 90.09% 🍏

File Coverage
LoggerLevel.java 100% 🍏
SimpleLogMessageRender.java 100% 🍏
ConsoleMessageConsumer.java 100% 🍏
DefaultLoggerConfig.java 99.02% -0.98% 🍏
DefaultLoggerConfigLoader.java 92.31% -7.69% 🍏
LoggerConfigResolver.java 88.89% -11.11% 🍏
DefaultLogger.java 84.66% 🍏
DefaultLoggerFactory.java 84.62% -15.38% 🍏
DefaultLoggerService.java 80.93% -11.02% 🍏
Logger.java 75.81% 🍏
NoOpsLoggerFactory.java 70% -30% 🍏
LoggerManager.java 68.27% -11.54% 🍏
Slf4jLoggerFactory.java 65.45% -29.09% 🍏
NoOpsLogger.java 50% -40%
NoOpsLoggerService.java 30% -70%
Slf4jLogger.java 0% -2.9%

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This pull request refactors RLib’s logger stack to support a configurable message pipeline, evolves the logger APIs to provide richer context (Logger instance + shortName) during rendering/consumption, and updates SLF4J integration and tests accordingly.

Changes:

  • Evolved rlib-logger-api contracts (factory/service entrypoints, Logger.shortName(), and LoggerService.write(Logger, ...)) and introduced NoOps null-object replacements.
  • Introduced a config-driven logging pipeline in rlib-logger-impl (config/loader/resolver + consumers/renderers) and rewired DefaultLoggerService/DefaultLogger to use it.
  • Expanded/rewrote regression tests for level threshold semantics and consumer routing.

Reviewed changes

Copilot reviewed 29 out of 29 changed files in this pull request and generated 7 comments.

Show a summary per file
File Description
rlib-logger-slf4j/src/main/java/javasabr/rlib/logger/slf4j/Slf4jLoggerFactory.java Updates SLF4J factory to new LoggerFactory API, adds caching, exposes a LoggerService.
rlib-logger-slf4j/src/main/java/javasabr/rlib/logger/slf4j/Slf4jLogger.java Implements Logger.shortName() and aligns SLF4J logger wrapper with updated API.
rlib-logger-slf4j-impl/src/test/java/javasabr/rlib/logger/slf4j/impl/Slf4jLoggerImplTest.java Refactors SLF4J-impl tests to the new consumer/config pipeline.
rlib-logger-impl/src/test/java/javasabr/rlib/logger/impl/DefaultLoggerTest.java Adds coverage for shortName and verifies level threshold + consumer routing behavior via config.
rlib-logger-impl/src/main/resources/META-INF/services/javasabr.rlib.logger.api.LoggerFactory Switches ServiceLoader entry from the old service to the new DefaultLoggerFactory.
rlib-logger-impl/src/main/java/javasabr/rlib/logger/impl/FolderFileListener.java Removes legacy listener-based file output implementation.
rlib-logger-impl/src/main/java/javasabr/rlib/logger/impl/DefaultLoggerService.java Replaces listener/writer output with config-driven consumer routing + per-level consumer caching.
rlib-logger-impl/src/main/java/javasabr/rlib/logger/impl/DefaultLoggerFactory.java Adds a ServiceLoader-instantiated factory that owns the DefaultLoggerService + config resolver integration.
rlib-logger-impl/src/main/java/javasabr/rlib/logger/impl/DefaultLogger.java Adds shortName and caches resolved consumers per level; updates writes to pass Logger instance to service.
rlib-logger-impl/src/main/java/javasabr/rlib/logger/impl/config/LogMessageRender.java Introduces message rendering contract for consumers.
rlib-logger-impl/src/main/java/javasabr/rlib/logger/impl/config/LogMessageConsumer.java Introduces consumer contract for configurable routing.
rlib-logger-impl/src/main/java/javasabr/rlib/logger/impl/config/LoggerConfigResolver.java Adds resolver for selecting an active LoggerConfig (loader-based).
rlib-logger-impl/src/main/java/javasabr/rlib/logger/impl/config/LoggerConfigLoader.java Adds config loader extension point.
rlib-logger-impl/src/main/java/javasabr/rlib/logger/impl/config/LoggerConfig.java Adds core config contract for level enablement and consumer resolution.
rlib-logger-impl/src/main/java/javasabr/rlib/logger/impl/config/impl/SimpleLogMessageRender.java Provides a default renderer including timestamp + shortName.
rlib-logger-impl/src/main/java/javasabr/rlib/logger/impl/config/impl/package-info.java Applies JSpecify nullness defaults for config impl package.
rlib-logger-impl/src/main/java/javasabr/rlib/logger/impl/config/impl/DefaultLoggerConfigLoader.java Provides a default config loader (root INFO + console consumer).
rlib-logger-impl/src/main/java/javasabr/rlib/logger/impl/config/impl/DefaultLoggerConfig.java Implements level-threshold and per-level consumer fallback semantics.
rlib-logger-impl/src/main/java/javasabr/rlib/logger/impl/config/impl/ConsoleMessageConsumer.java Implements console output routing based on level (stdout vs stderr).
rlib-logger-api/src/test/java/javasabr/rlib/logger/api/LoggerTest.java Updates API tests to satisfy new Logger.shortName() contract.
rlib-logger-api/src/main/java/javasabr/rlib/logger/api/LoggerService.java Updates service contract to accept Logger instance in write(...) and removes legacy listener/writer APIs.
rlib-logger-api/src/main/java/javasabr/rlib/logger/api/LoggerManager.java Updates manager to new factory API and exposes getLoggerService().
rlib-logger-api/src/main/java/javasabr/rlib/logger/api/LoggerLevel.java Extends log level model with severity.
rlib-logger-api/src/main/java/javasabr/rlib/logger/api/LoggerFactory.java Renames make(...) to getLogger(...) and exposes getLoggerService().
rlib-logger-api/src/main/java/javasabr/rlib/logger/api/Logger.java Adds shortName() to the logger contract.
rlib-logger-api/src/main/java/javasabr/rlib/logger/api/impl/NullLoggerFactory.java Removes legacy null logger factory implementation.
rlib-logger-api/src/main/java/javasabr/rlib/logger/api/impl/NoOpsLoggerService.java Adds NoOps LoggerService implementation for factories that can’t provide config.
rlib-logger-api/src/main/java/javasabr/rlib/logger/api/impl/NoOpsLoggerFactory.java Adds NoOps LoggerFactory fallback implementation.
rlib-logger-api/src/main/java/javasabr/rlib/logger/api/impl/NoOpsLogger.java Renames null logger to NoOps logger and implements shortName().

@github-actions
Copy link
Copy Markdown

github-actions Bot commented Jun 5, 2026

Overall Project 56.97% -0.29% 🍏
Files changed 87.8% 🍏

File Coverage
LoggerLevel.java 100% 🍏
SimpleLogMessageRender.java 100% 🍏
ConsoleMessageConsumer.java 100% 🍏
DefaultLoggerConfig.java 99.02% -0.98% 🍏
DefaultLoggerConfigLoader.java 92.31% -7.69% 🍏
LoggerConfigResolver.java 88.89% -11.11% 🍏
DefaultLogger.java 84.66% 🍏
DefaultLoggerFactory.java 84.62% -15.38% 🍏
Logger.java 75.81% 🍏
DefaultLoggerService.java 74.25% -18.66% 🍏
NoOpsLoggerFactory.java 70% -30% 🍏
LoggerManager.java 68.27% -11.54% 🍏
Slf4jLoggerFactory.java 65.45% -29.09% 🍏
NoOpsLogger.java 50% -40%
NoOpsLoggerService.java 30% -70%
Slf4jLogger.java 0% -2.9%

@JavaSaBr JavaSaBr merged commit fae036f into develop Jun 5, 2026
6 checks passed
@JavaSaBr JavaSaBr deleted the improve-logger-part-2 branch June 5, 2026 13:08
@github-actions
Copy link
Copy Markdown

github-actions Bot commented Jun 5, 2026

Overall Project 56.94% -0.29% 🍏
Files changed 87.8% 🍏

File Coverage
LoggerLevel.java 100% 🍏
SimpleLogMessageRender.java 100% 🍏
ConsoleMessageConsumer.java 100% 🍏
DefaultLoggerConfig.java 99.02% -0.98% 🍏
DefaultLoggerConfigLoader.java 92.31% -7.69% 🍏
LoggerConfigResolver.java 88.89% -11.11% 🍏
DefaultLogger.java 84.66% 🍏
DefaultLoggerFactory.java 84.62% -15.38% 🍏
Logger.java 75.81% 🍏
DefaultLoggerService.java 74.25% -18.66% 🍏
NoOpsLoggerFactory.java 70% -30% 🍏
LoggerManager.java 68.27% -11.54% 🍏
Slf4jLoggerFactory.java 65.45% -29.09% 🍏
NoOpsLogger.java 50% -40%
NoOpsLoggerService.java 30% -70%
Slf4jLogger.java 0% -2.9%

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants